perm filename SCAN.FAI[NEW,LCS] blob
sn#519462 filedate 1980-06-13 generic text, type T, neo UTF8
TITLE SCANR
ENTRY SCANR,LNEND,STFNUM
EXTERNAL SCN,SC,ALF,NALF,EXP3.2,SCX,SCM,RMOD,JCHAR,A2Z,MKX
ML←5 ↔ K←0 ↔ NNUM←14 ↔ ISKP←13 ↔ JJ←12 ↔ XMINUS←11 ↔ DECI←10
M←7 ↔ N←6 ↔ QQ←4 ↔ TRIP←3
DEFINE LTT<A2Z+=19> ↔ DEFINE LZ<A2Z+=25>
DEFINE LM <A2Z+=12> ↔ DEFINE LN<A2Z+=13> ↔ DEFINE LP <A2Z+=15>
DEFINE LL <A2Z+=11> ↔ DEFINE LR<A2Z+=17> ↔ DEFINE LBL <SCX+=11>
;; DEFINE LL <SCN> ↔ DEFINE LR<SCN+1> ↔ DEFINE LBL <SCX+=11>
DEFINE LSL <MKX> ↔ DEFINE LST <SCX+=7 > ↔DEFINE LCM<SCX>
;; DEFINE LSL <SCN+4> ↔ DEFINE LST <SCX+=7 > ↔DEFINE LCM<SCX>
DEFINE LE <A2Z+4> ↔ DEFINE LC <A2Z+2> ↔ DEFINE LS <A2Z+=18>
;; DEFINE LE <SCN+5> ↔ DEFINE LC <SCN+6> ↔ DEFINE LS <SCN+7>
DEFINE LPL<SCX+=6 > ↔DEFINE LMI<SCX+1> ↔ DEFINE LF <A2Z+5>
;; DEFINE LPL<SCX+=6 > ↔DEFINE LMI<SCX+1> ↔ DEFINE LF <SCN+=8>
DEFINE LA <A2Z> ↔ DEFINE LI <A2Z+=8> ↔ DEFINE LW <A2Z+=22>
;; DEFINE LA <SCN+=9> ↔ DEFINE LI <SCN+=10> ↔ DEFINE LW <SCN+=11>
DEFINE JN <SC+=10> ↔ DEFINE DBST <SC+=11> ↔ DEFINE ISEMI <JCHAR+1>
DEFINE IXX <A2Z+=23> ↔ DEFINE MODE <SC+=70> ↔ DEFINE VX <SC+=16>
DEFINE LU <A2Z+=20> ↔ DEFINE LD <A2Z+3> ↔ DEFINE INP <ALF>
;; DEFINE LU <SCN+2> ↔ DEFINE LD <SCN+3> ↔ DEFINE INP <ALF>
DEFINE REXP<SC+6> ↔DEFINE DOT<SCX+2> ↔ DEFINE VX4 <SC+=19>
;; DEFINE STAFF<SCM+=80>
IQ: BLOCK 12
; 00100 C SUBRS. SCANR, NALF, EDIT, PRESCN
; 00300 C ***** MSS SCANNER *************************
; 00400 SUBROUTINE SCANR
; 00500 DIMENSION IQ(10),LRUD(4)
; 00600 COMMON/ALF/INP(72),ML
;650 COMMON/SCN/LL,LR,LU,LD,LSL,LE,LC,LS,LF,LA,LI,LW
; COMMON/SCX/JALPHA(30),J4,L,Y,K,RX,RZ,RA,J5 /JCHAR/IXX,ISEMI,JBLA,IG
; 00700 COMMON /SC/J,L,MK
; 00800 1 ,ISKP,XMINUS,N,REXP,LK,NNUM,JJ,JN,DBST,NFLG,JXX,JSEMI,QQ
; 00900 1 ,VX(50),IAMP,K,RRN,M,MODE,IBLA
;1000 EQUIVALENCE (IQ(1),VX(41)),(VX1,VX(1)),(VX2,VX(2)),(LDN,LRUD(4))
; 01100 DATA LRUD/'L','R','U','D'/
; 01200 C FOR LEFT, RIGHT, UP, DOWN, EDIT
SCANR: 0
MOVE ML,ALF+=72 ; 5 IS ML UNTIL RETURN
SETOM NNUM ;1300 NNUM=-1
SETZM ISKP ;1400 ISKP=0
SETZM JJ ; 01500 JJ=0
MOVSI XMINUS,201400 ; 01600 XMINUS=1.
; 01700 C LEAVES BLANK WHEN REST.
; 01800 999 DECI=-1
S999: SETOM DECI ;INTEGER UNTIL S11!
SETZM M ; 01900 M=0
S2799: MOVE N,INP -1(ML) ; 02000 2799 N=INP(ML)
S899: AOS ML ; 02100 899 ML=ML+1
CAMN N,LSL ; 02200 781 IF(N.EQ.'/')N=ISEMI
MOVE N,ISEMI
;2300 C FOR MOTIVIC TRANFORMATIONS
CAME N,LST ;02380 IF(N.EQ.'*')GO TO 751
CAMN N,ISEMI
JRST S751 ; 02400 IF(N.EQ.ISEMI)GO TO 751
; 02500 C '*' AND '/' ADDED ABOVE 4/18/73
CAMN N,IXX ; 02600 IF(N.NE.IXX)GO TO 22
SKIPGE SC+=10 ; JN
JRST S22 ; 02650 IF(JN)GO TO 22
JUMPE ISKP,S210 ;02700 IF(ISKP.EQ.0)GO TO 210
SOS ML ; 02800 ML=ML-1
JRST S202 ; 02900 GO TO 202
S22: CAMN N,LBL ;3000 22 IF(N.EQ.IBLA)GO TO 4702
JRST S4702 ; 03050 IF(N.NE.',')GO TO 510
CAME N,LCM
JRST S510
S4702: JUMPGE ISKP,S2799 ;3100 4702 IF(ISKP)202,2799,2799
JRST S202 ; 03200 512 ML=ML+1
S512: MOVE 2,ISEMI
AOS ML ; 03300 IF(INP(ML).EQ.ISEMI)RETURN
CAMN 02,INP -1(ML)
JRST SEND
JRST S512+1 ; 03400 GO TO 512
LRUD: ASCII/L /
ASCII/R /
ASCII/U /
ASCII/D /
S510: MOVE 02,JN ;3600 510 IF(JN.GE.0)GO TO 173
JUMPGE 02,S173
MOVEI 02,1 ;3700 C SKIP(JN=+1) IF NOT COMING FROM 'EDIT'
MOVEM 02,JN ; 03800 JN=1
MOVEI 15,1 ; 03900 DO 702 K=1,4
;;S702: CAMN N,SCN -1(15) ;4000 702 IF(N.EQ.LRUD(K))GO TO 703
;; JRST S703
;!!!! 1/78 CAIGE 15,4
;; CAIGE 15,4 **************************
;; AOJA 15,S702 ; 04100 C FINDS L, R, U, D
S702: CAMN N,LRUD -1(15) ;4000 702 IF(N.EQ.LRUD(K))GO TO 703
JRST S703
CAIGE 15,4
AOJA 15,S702 ; 04100 C FINDS L, R, U, D
;;;; CAMN N,A2Z+=11 ; L?
;;;; JRST S703
;;;; AOS 15
;;;; CAMN N,A2Z+=17 ; R?
;;;; JRST S703
;;;; AOS 15
;;;; CAMN N,A2Z+=20 ; U?
;;;; JRST S703
;;;; AOS 15
;;;; CAMN N,A2Z+=3 ; D?
;;;; JRST S703
CAMLE N,LBL ;GO TO S703 IF REALLY A LETTER, ELSE MOVE UP POINTER
JRST S899 ;****** 1/78
S703: AOS JJ ; 703 JJ=JJ+1 04200 YOU CAN TYPE THE FULL WORD
MOVE K,15 ; 04400 IF(K.NE.4)GO TO 77
CAIE K,4
JRST S77 ; 04450 IF(INP(ML).EQ.'E')K=99
MOVE 2,LE
CAMN 2,INP-1(ML)
MOVEI K,=99 ; 04500 C 'DE'=DELETE
S77: CAMN N,LE ; 04600 77 IF(N.EQ.'E')K=55
MOVEI K,=55 ; 04700 C 'E'= EDIT
CAMN N,LC ; 04800 IF(N.EQ.'C')K=2222
MOVEI K,=2222 ; COPY 04900 IF(N.EQ.IXX)K=222
CAMN N,IXX ; EXIT
MOVEI K,=222 ;05000 C 'C'=COPY, 'X'=EXIT FROM EDIT MODE
FLTR K,K ; 05100 VX(JJ)=K
MOVEM K,VX-1(JJ) ;05200 704 IF(INP(ML).EQ.IBLA)GO TO 2799
S704: SKIPL INP-1(ML) ;IF(INP(ML).GT.0)GO TO 2799
JRST S2799 ; IF NEXT CHAR. IS A LETTER(NEG.), SKIP IT.
; 05300 C PUT COMMA ERASER IN SCX.
AOJA ML,S704 ;05400 ML=ML+1
; 05500 C SO IT WILL SKIP 'D' AND 'EL' IN 'EDIT' AND 'DEL'
; GO TO 704
S173: JSA 16,NALF ; 05700 173 K=NALF(N)
JUMP N ; 0 IS K
JUMPG N,S1410 ;05800 IF(N.GT.0)GO TO 1410
CAIN =18 ;5810 --R-- IF(K.EQ.18)GO TO 73
JRST S73
MOVEI 02,2 ; 05815 C JUMP IF A REST OR OTHER R'S
CAMN 02,MODE ; 05820 IF(MODE.EQ.2)GO TO 144
JRST S144
;YOU CAN TYPE 'S', ETC., FOR SIXTEENTH ETC., RHYTHM.
; JUMP IF NOT A LETTER
; notes = 1xyz.0 x=accidental, yz=note num., negative=chord note
; rest = 2xyz.0 z=0=ordinary, =1=invis., =2=whole, =3=repeat bar
; =4=down, =5=up, -2xyz=num. of meas. rest
; clefs = 3xyz.0 z=0=treble, =1=bass, =2=alto, =3=tenor, neg.=invis.
; use TRE,BAS,ALT,TEN for clefs with no change to note levels.(4,5,6,7)
; bars = 4xyz.0 z=num. of staves up, neg.=dbl.bar
; ksig = 17xyz.0 z=num. of accis., pos.=#, neg.=b, x=1 for naturals.
; meter = 18xyz.n xy=top num, zn=bottom num (DONE IN SCMSS)
; stem = 5xyz.0 YZ=10=stem up, =20=stem down
; staff = 5xyz.0 z=0=return to norm., =1=lower stf., =2=upper stf.
CAIGE =8 ;6100 --H-- IF(K.LT.8)GO TO 15
JRST S15 ;06200 C JUMP IF A POSSIBLE NOTE
CAIE =11 ;6300 --K-- IF(K.NE.11)GO TO 16
JRST S16 ;06400 C JUMP IF NOT A KSIG
MOVE QQ,[17000.0] ;QQ=17000 **** KEY SIGS ***
S18: MOVE N,INP-1(ML) ;6500 18 N=INP(ML)
AOS ML ; 06600 ML=ML+1
CAMN N,LBL ;IF(N.EQ.IBLA)GO TO 18
JRST S18
;; CAME N,[ASCIZ/N /] ; IS IT AN N? K3FN/ OR K2SN/ MAKES NATURALS
CAME N,LN ; IS IT AN N? K3FN/ OR K2SN/ MAKES NATURALS
JRST S200 ;IF NEXT CHAR='N' A 'NATURALS' KEY SIG.
MOVE 2,[100.0]
SKIPG QQ
MOVNS 2
FADR QQ,2
JRST S18
S200: CAME N,LS ; 06750 IF(N.EQ.'S')GO TO 18
CAMN N,LPL ; 06775 IF(N.EQ.'+')GO TO 18
JRST S18 ; 06800 IF(N.EQ.ISEMI)GO TO 20
CAMN N,ISEMI
JRST S20 ; 06900 IF(N.EQ.'-')N='F'
CAMN N,LMI
JRST .+3 ;6950 IF(N.NE.'F')GO TO 18
CAME N,LF
JRST S19 ; 07200 19 A=NALF(N)
MOVNS QQ ;NEG. FOR FLATS
JRST S18 ;GO BACK AND LOOK AGAIN
S19: JSA 16,NALF
JUMP N
FLTR K,K ;TLC K,232000
JRST S18
S20: JUMPL QQ,.+3
FADR QQ,K
SKIPA
FSBR QQ,K ;07400 20 VX(1)=(17000.+A)*XMINUS
MOVEM QQ,VX ;07500 KSIG
JRST SEND ; 07600 RETURN
S16: CAIE =9 ;-- I -- 7700 16 IF(K.NE.9)GO TO 2
JRST S2
MOVSI 02,205540 ; 07800 VX(1)=22.
MOVEM 02,VX ; 07900 C FOR EDIT I21 ETC.
JRST S2799 ;8000 GO TO 2799
S2: CAIE =13 ; -- M -- 08100 2 IF(K.NE.13)GO TO 3
JRST S3 ;8200 C JUMP IF NOT A MEASURE LINE
;; MOVSI 02,214764 ; ***** BARS =4000 ******
MOVE 2,[4001.0] ; THE 1 IS FOR BAR ONE STAFF ONLY.
MM: MOVE 1,INP -1(ML) ;08310 MM: JN=INP(ML)
MOVEM 1,JN
;; CAME 1,LD ; 08320 IF(JN.NE.LD)GO TO 23
CAMN 1,LD ; IF (JN.EQ.LD)GO TO MD ;; JRST S23
JRST MD
CAME 1,[-=27245141952] ;IF (JN.NE.'M')GO TO 23
JRST S23
FADR 2,[1.0] ;VX(1)=VX(1)+1 GO TO MM
AOJA ML,MM ; GO BACK AND LOOK FOR MORE M'S ML=ML+1
MD: AOS ML ;8330 ML=ML+1
; FOUND 'MDN' -- FOR DOUBLE BARS
SETZM JN ;8350 JN=0
MOVNS 02 ;DBL BARS ARE NEG.
S23: MOVEM 02,VX
JSA 16,NALF
JUMP INP-1(ML) ;8400 23 K=NALF(INP(ML))
JUMPLE K,S512 ; 08500 IF(K.LE.0)GO TO 512
CAILE =9 ; 08505 IF(K.GT.9)GO TO 512
JRST S512 ;NO MORE THAN 8 STAVES UP ALLOWED.
SOJ K, ;K=K-1 BECAUSE ORIG. NUM WAS 4001, NOT 4000
SKIPN JN ;8510 OLD CODE HERE! IF(JN.EQ.0)K=K+10
MOVNS K ;NEG. IF DBL BAR
FLTR K,K
FADRM K,VX ;08600 C 'M2'= A BAR LINE UP 2 STAVES. ETC.
JRST S512 ; 08700 GO TO 512
S3: CAILE =16 ;-- P -- 08800 3 IF(K.GT.16)GO TO 4
JRST S4 ; 08900 C JUMP IF NOT FOR 'PROXIMITY' MODE
SUBI =15 ; 09000 NSWCH=K-15
MOVEM K,NSWCH#
JRST S2799 ; 09100 GO TO 2799
; TO SWITCH ALWAYS USE OCT.# /PBF4/ /OE5/ P=PROXIMITY, O=ORDINARY
S4: CAIE =20 ; 09500 4 IF(K.NE.20)GO TO 21
JRST S21 ; 09600 C TRY AGAIN IF NOT A 'T'
MOVE 3,INP -1(ML) ;09700 IF(INP(ML).GT.0)GO TO 2799
JUMPG 3,S2799;T12,8/ ETC. MAKES A METR, OR TIM SIG. POS NUMS AREN'T LETRS!
MOVSI 02,214567 ; ***** CLEFS = 3000 ***** CODE 3.
CAMN 3,LE
FADR 2,[3.0] ; TENOR CLEF =3003, TREBLE=3000
JRST SCLEF ; 10100 GO TO SCLEF
S21: CAIE =19 ; -- S -- 10200 21 IF(K.NE.19)GO TO 899
JRST S2799 ;NOT AN 'S'(STEM), UNKNOWN ITEM, SKIP IT.
MOVE 2,INP-1(ML) ;10600 IF(INP(ML).EQ.LDN)VX(1)=5020.
MOVE 03,[5000.0] ; SU UP=5010
CAMN 2,LU
FADR 3,[10.0]
CAMN 2,LD
FADR 3,[20.0] ; DOWN = 5020
CAMN 2,LPL ;IF( .EQ.'+') S+=5002
FADR 3,[2.0]
CAMN 2,LMI ;IF( .EQ.'-') S-=5001
FADR 3,[1.0] ; IF( .EQ.'0') S0=5000
;THESE ARE FOR S+, S-, S0; PUT NOTE ON OTHER STF.
MOVEM 03,VX
JRST S512 ; 10700 GO TO 512
S15: MOVE N,INP -1(ML) ; 11100 N=INP(ML)
CAIN K,2 ;IF(1ST LETR.NE.'B')GO TO S5
CAME N,LA ; 11200 IF(N.NE.'A')GO TO 5
JRST S5 ; 11300 C JUMP IF NOT BASS CLEF
MOVE 02,[3001.0] ;BASS CLEF=3001
SCLEF: MOVE N,INP(ML) ;N=INP(ML+1) GET 3RD CHAR.
CAMN N,LBL ;IF(N.EQ.' '.OR.N.EQ.'/'.OR.N.EQ.';')GO TO SCLF
JRST SCLF ;IF 3RD CHAR IS SIGNIFICANT THEN SPECIAL CLEF
CAME N,LSL ; 4,5,6,7 = 0,1,2,3 BUT NO INFLUENCE ON NOTE LEVEL
CAMN N,ISEMI
JRST SCLF
FADR 2,[4.0]
AOS ML ;ML=ML+1
SCLF: MOVEM 02,VX
SKIPGE XMINUS ; 11500 51 IF(XMINUS)VX(1)=-VX(1)
MOVNS VX ;11600 TYPE '-BA' FOR INVISIBLE BASS CLEF, ETC.
JRST S512
S5: CAME N,LL ; 11800 5 IF(N.NE.'L')GO TO 6
JRST S6 ; 11900 JUMP IF NOT ALTO CLEF
MOVE 02,[3002.0]
JRST SCLEF
S6: SUBI 2 ; -2 BECAUSE MUSICAL ALPHABET STARTS WITH C
SKIPG
ADDI 7
MOVE NNUM,K ; K IS AC0
MOVEI QQ,=1000
MOVEI K,1 ;6 K=1
CAILE NNUM,3 ; 12300 IF(NNUM.GT.3)K=2
AOJ K, ;12500 C FOUND A NOTE
CAMN N,IXX ; 12700 IF(N.EQ.IXX)GO TO 5410
JRST S5410 ; 12800 C FOR GX3/ ETC.
CAME N,INP-2(ML) ;IF(N.NE.INP(ML))GO TO SS6
JRST SS6 ; NO DOUBLE-LETTER ACCID. (FLAT)
CAME N,INP(ML) ;IF(N.NE.INP(ML+1))GO TO S8-2
JRST S8-2 ;NO TRIPLE-LETTER ACCID. (SHARP)
AOS ML ;ML=ML+1
CAME N,INP(ML) ;IF(N.NE.INP(ML+1))GO TO S8
JRST S8 ;NO TRIPLE-LETTER ACCID. (NATURAL)
AOS ML ;ML=ML+1
MOVEI QQ,=1300 ;TYPE AA FOR AF, AAA = AS, AAAA = AN
JRST S610
SS6: JSA 16,NALF ; 12900 K=NALF(N)
JUMP N
JUMPG N,S7 ;13000 IF(N.GT.0)GO TO 7
;13100 C JUMP IF NOT A LETTER
MOVEI QQ,=1300 ; ***** NOTES ***** =1000 2ND DIG=ACCI.
CAIE =22 ;*** CAN USE 'V' FOR NATURAL(EASIER TO HIT!!)
CAIN =14 ; --N-- = 13300 IF(K.EQ.14)GO TO 610
JRST S610 ; 13500 C JUMP IF NATURAL
CAIN =19 ; -- S -- = 13400 IF(K.EQ.19)GO TO 8
JRST S8
MOVEI QQ,=1100 ; IT'S A FLAT
JRST S610
S8: MOVEI QQ,=1200 ; SHARP =1200
S610: AOS ML ; 14100 610 ML=ML+1
JSA 16,NALF ;14200 K=NALF(INP(ML))
JUMP INP-1(ML)
SKIPL INP-1(ML) ;IF CHAR. ISN'T A LETTER, GO TO S7
JRST S7 ; (LETTERS ARE NEG., NUMBS ARE POS.)
CAIE =19 ;IF(K.EQ.19) THEN IT'S SS
JRST .+3 ;FOR DBL FLAT, DBL SHARP
MOVEI QQ,=1500 ;DBL FLAT
JRST S610
CAIE 6 ;IS IT 'FF'?
JRST S7
MOVEI QQ,=1400 ;FF=1400, SS=1500
JRST S610 ; GO BACK FOR ANOTHER CHAR.
S7: CAIN =11 ;-- K -- ??? 14300 7 IF(K.EQ.11)GO TO 5410
JRST S5410
JUMPL K,S5410 ; 14350 IF(K.LT.0)GO TO 5410
;14400 C JUMP IF SEMICOLON OR BLANK
CAIN =24 ;-- X --14500 IF(K.NE.24)GO TO 24
JRST S5410 ; 14800 24 JSCA=K-1
S24: MOVEM K,JSCA# ; SAVE OCT. NUM
AOS ML ; 14900 ML=ML+1
JRST S2410
S5410: SKIPN NSWCH ;15300 5410 IF(NSWCH.EQ.0)GO TO 2410
JRST S2410
MOVN JJ,NNUM ; 15910 7410 JJ=NOLD-NNUM
ADD JJ,NOLD
CAIL JJ,4 ; 15920 IF(JJ.LT.4)GO TO 377
AOS JSCA
CAMG JJ,[-4] ; 16010 377 IF(JJ.GT.-4)GO TO 2410
SOS JSCA
;WILL JUMP TO NEAREST NOTE (DIATONIC-'75)
S2410: MOVEI JJ,1 ; 16200 2410 JJ=1
SETZM VX+1 ; 16300 VX2=0
MOVE 2,JSCA ;VX1=(1000+ACCI*100+OCT*7+NNUM)*DBST
IMULI 2,7
ADD 2,NNUM
ADD 2,QQ ; ADD 1000+OCT*7 (QQ)
FLTR 2,2
FMPR 2,DBST
MOVEM 2,VX ; 16500 C DOUBLE STOPS ARE NEG. NUMBERS
MOVEM NNUM,NOLD# ; 16600 NOLD=NNUM
;; ?S4410: MOVNI NNUM,2 ;16700 4410 NNUM=-2
S4410: MOVE 02,ISEMI ;16800 IF(INP(ML).EQ.ISEMI)RETURN
CAMN 02,INP -1(ML)
JRST SEND
;ABOVE FINDS SCALE NOTES; IF NSWCH=0 OCT. NUM WILL STICK UNTIL RESET
JRST S310
S210: AOS JJ ; 17100 210 JJ=JJ+1
CAIN JJ,1 ; 17200 IF(JJ.EQ.1)GO TO 3310
JRST S3310
MOVSI XMINUS,201400 ; 17300 XMINUS=1.
SETZM VX -1(JJ) ; 17400 VX(JJ)=0
; 'X N1,N2' MAY REPLACE 'REP N1,N2'. N2=0 BECOMES N2=2
JRST S310 ; 17800 C JUMP IF A LETTER
S1410: MOVE MODE ; 17900 1410 IF(N.NE.'-')GO TO 14
CAME N,LMI
JRST S544
MOVN XMINUS,[1.0] ; 18000 XMINUS=-1.
JUMPE JJ,S2799 ; IF(JJ.EQ.0)GO TO 2799 -- FOR '-BA' ETC.
CAIN 1
JRST S644 ; IF(MODE.EQ.1)GO TO 644 [FOR AUTO OCT. SYS.]
JRST S2799 ; 18100 GO TO 2799
S544: CAIN 1 ; IF(N.NE.'+')GO TO 14
CAME N,LPL
JRST S14
S644: MOVSI 7,203700 ; [7.0] DEFAULT IS OCTAVE. (+ OR - 7)
JSA 16,NALF
JUMP ALF-1(ML) ;THE NEXT CHARACTER.
CAIG =9
SKIPG
JRST S744 ;NEXT IS NOT A NUMB.
FLTR 7,0 ;MOVE 7,0
AOJ ML,
S744: CAME N,LPL
MOVNS 7
MOVEM 7,VX4 ; SEND IT TO SCMSS -- AT 71
JRST S2799
; 18102 144 TRIP=0
S144: SETZM TRIP
; 18105 444 IF(K.EQ.8)VX1=2
S444: CAIE =8
JRST .+3
MOVSI 2,202400
JRST SVX
CAIE 4 ;18107 IF(K.EQ.4)VX1=.5
JRST .+3
MOVSI 2,200400
JRST SVX
CAIE 5 ; 18110 IF(K.EQ.5)VX1=8
JRST .+3
MOVSI 02,204400
JRST SVX
CAIE 7 ; 18115 IF(K.EQ.7)VX1=88
JRST .+3
MOVSI 02,207540
JRST SVX
CAIE =19 ; 18120 IF(K.EQ.19)VX1=16
JRST .+3
MOVSI 02,205400
JRST SVX
CAIE =20 ; 18125 IF(K.NE.20)GO TO 244
JRST S244
MOVSI 02,204600 ; 18126 VX1=12
MOVE N,INP -1(ML) ; 18127 N=INP(ML)
CAME N,LBL ; 18129 IF(N.EQ.LBL)GO TO 344
CAMN N,ISEMI
;; JRST S344 ; 18131 IF(N.EQ.ISEMI)GO TO 344
JRST SVX
CAIE N,1 ;IF(N.EQ.1)GO TO SVX (DOT WAS CHANGED TO 1)
CAMN N,IXX ; IF(N.EQ.IXX)GO TO SVX
JRST SVX
MOVSI TRIP,576400 ; 18133 TRIP=-1
AOS ML ; 18150 ML=ML+1
JSA 16,NALF ; 18155 K=NALF(N)
JUMP N
MOVE N,INP-1(ML) ; N=INP(ML) *******
JRST S444 ; 18160 GO TO 444
S244: CAIE =23 ; 18220 244 IF(K.EQ.23)VX1=1
JRST .+3
MOVSI 02,201400
JRST .+4
CAIE =17 ; 18222 IF(K.EQ.17)VX1=4
JRST .+3
MOVSI 02,203400
SVX: MOVEM 02,VX ; 18223 C TS=24TH, TQ=6, TH=3.
; FOR S,E,Q,H,W,D,T RHYTH. 'T'(K=20) =TRIPLET D=DBL WHL NOTE
JUMPGE TRIP,S344 ;18225 IF(TRIP)VX1=VX1*1.5
MOVSI 2,201600
FMPRM 02,VX
S344: AOS JJ ; 18226 344 JJ=JJ+1
JRST S1310
S14: SETOM ISKP ; 18230 14 ISKP=-1
CAME N,DOT ; 18300 IF(N.NE.'.')GO TO 79
JRST S79
MOVE DECI,M ; 18400 DECI=M
JRST S75
S79: AOS M ; 18600 79 M=M+1
JSA 16,NALF ;18700 IQ(M)=NALF(N)
JUMP N
MOVEM 00,IQ -1(M)
S75: CAMN N,ISEMI ;18900 75 IF(N.EQ.ISEMI)GO TO 751
JRST S751
MOVEI 02,1 ; 18950 IF(INP(ML).NE.1)GO TO 2799
CAME 02,INP -1(ML)
JRST S2799
S751: JUMPE ISKP,SEND ; 19000 751 IF(ISKP.EQ.0)RETURN
S202: CAME DECI,[-1] ; 19100 202 IF(DECI.NE.-1)GO TO 302
JRST S302
SETZM DECI ; 19200 DECI=0
JRST S402
S302: SUB DECI,M ; 19400 302 DECI=M-DECI
MOVNS DECI ; 19500 402 RRN=0
S402: SETZM RRN# ; 19600 REXP=M-1
MOVNI 02,1
ADD 02,M
FLTR 2,2 ;TLC 2,232000
;; FADR 2,2
MOVEM 2,REXP ; 19700 IF(M.LT.1)M=1
CAIGE M,1
MOVEI M,1 ; 19800 DO 171 K=1,M
MOVEI QQ,1 ;USE QQ FOR INDEX
; 19900 IF(REXP.GT.1)GO TO 1
S171: MOVSI 02,201400
CAMGE 02,REXP
JRST S1 ; 20000 RRV=10
MOVSI 02,204500 ; RRV IS IN 2
SKIPN REXP ; 20100 IF(REXP.EQ.0)RRV=1
MOVSI 02,201400
JRST S11 ; 20300 1 RRV=10.**REXP
S1: MOVSI 02,204500
MOVE 03,REXP
PUSHJ 17,EXP3.2 ;20400 11 RRN=RRN+IQ(K)*RRV
S11: FLTR 3,IQ-1(QQ) ;MOVE 3,IQ-1(QQ)
FMPR 2,3
FADRM 2,RRN ; 20500 171 REXP=REXP-1
MOVSI 02,576400
FADRM 02,REXP
CAMGE QQ,M
AOJA QQ,S171
JUMPE DECI,.+6
FLTR DECI,DECI ;TLC DECI,232000
MOVSI 02,204500 ; 20600 A=10.**DECI
MOVE 03,DECI
PUSHJ 17,EXP3.2 ; A WILL BE IN AC2
SKIPA ; 20700 IF(DECI.EQ.0)A=1.
MOVSI 02,201400 ; 20800 JJ=JJ+1
AOS JJ ; 20900 VX(JJ)=RRN/A*XMINUS
MOVE 1,RRN
FDVR 1,2
FMPR 1,XMINUS
MOVEM 1,VX -1(JJ) ; 21000 JN=-JN
MOVNS 00,JN ;21100 C SETS IT TO -1 FOR L,R,U,D EDIT ROUTINE
MOVEI 02,2 ; 21200 IF(MODE.NE.2)XMINUS=1.
CAME 02,MODE
MOVMS XMINUS ; 21300 C************: MODE #?
; 21400 C ONLY ONE - NEEDED FOR RHY.COMPOSITE
S1310: MOVEI 3,1 ; 21500 1310 IF(INP(ML).NE.1)GO TO 310
CAME 3,INP -1(ML)
JRST S310 ;21600 VX(JJ+1)=VX(JJ)*2. ; FOR DOTTED RHYTHMS
;; MOVE 02,VX -1(JJ)
;; FSC 02,1
;; MOVEM 02,VX (JJ) ; 21700 JJ=JJ+1
;; AOS JJ ; 21800 ML=ML+1
MOVE 2,[1000.0] ;VX(JJ)=VX(JJ)+1000
FADRM 2,VX-1(JJ) ;1000 IS ADDED FOR EACH DOT. NO MORE COMPOSITES!!
AOS ML
JRST S1310 +1 ; 22000 206 ML=ML+2
S206: ADDI ML,2 ; 22100 3310 VX(1)=-99.
S3310: MOVN 02,[99.0]
MOVEM 02,VX ; 22200 310 ISKP=0
S310: SETZM ISKP ; 22300 IF(N.NE.ISEMI)GO TO 999
CAME N,ISEMI
JRST S999 ; 22500 RETURN
SEND: MOVEM ML,ALF+=72
MOVEM JJ,SC+=9
JRA 16,(16) ; 22600 73 JJ=JJ+1
S73: AOS JJ ; 22650 K=INP(ML)
MOVE K,INP -1(ML) ;22700 IF(K.EQ.'E')GO TO 206
CAMN K,LE
JRST S206 ; NEXT IS FOR A REST/R/ OR /RI/ FOR INVIS. REST
CAMN K,LD ; 22810 IF(K.EQ.'D')GO TO 1073
JRST S1073
; /RD/ OR /RU/ = REST 6 DOWN OR 6 UP.
CAMN K,LU ; 22830 IF(K.EQ.'U')GO TO 1173
JRST S1173 ; 22900 IF(K.EQ.'I')GO TO 573
CAMN K,LI
JRST S573 ; 22910 IF(K.EQ.'W')GO TO 273
CAMN K,LW
JRST S273
; /RW/ MAKES WHOLE REST REGARDLESS OF TIME VALUE GIVEN.
CAMN K,LR ;IF(K.EQ.'R')GO TO 1273
JRST S1273 ; /RR/ MAKES REPEAT BAR SIGN (REST=-4)
; *** ADD NUMBERS LATER *****; 22932 K=NALF(K)
JSA 16,NALF
JUMP K ; 22934 IF(K)GO TO 673
JUMPL K,S673 ; 22936 IF(K.GE.10)GO TO 673
CAIL =10
JRST S673 ; 22940 973 KV=NALF(INP(ML+1))
S973: MOVE 15,K
JSA 16,NALF
JUMP INP(ML)
; FOR 3-DIG. NUMBS. CAN TAKE NUM UP TO 999 FOR RESTS.
; 22942 IF(KV)GO TO 873
JUMPL S873 ;22944 IF(KV.GE.10)GO TO 873
CAIL =10
JRST S873 ; 22945 ML=ML+1
AOS ML ; 22946 K=K*10+KV
IMULI 15,=10
IMUL 02,K
ADD 15,K ; 15 IS K FOR NOW AND K IS IV
JRST S973+1
S873: ADDI 15,=2000 ; QQ IS AC15 NOW. RW =2002
MOVNS 15
FLTR 15,15 ;TLC 15,232000
JRST S473
S673: MOVSI 15,213764 ;QQ=2000
JRST S373 ;ORDINARY REST
S573: MOVE 15,[2001.0] ;INVISIBLE REST
JRST S473
S273: MOVE 15,[2002.0] ;WHOLE REST (NO MATTER WHAT RHYTH.]
S473: AOS ML ; 22990 473 ML=ML+1
S373: MOVEM 15,VX-1(JJ) ; 23000 373 VX(JJ)=QQ
JRST S4410
S1073: MOVSI 15,213765 ;RD = REST DONW 2004
JRST S473
S1173: MOVE 15,[2005.0] ;RU = REST UP 2005
JRST S473
S1273: MOVE 15,[2003.0] ;RR = BAR REPEAT SIGN
JRST S473 ; FOR /RR/
;23400 END
LNEND: 0 ;SEE FORTR. TEXT IN WORDS.F4
SETZ 4, ;IF BAD INPUT PUT ISEMI INTO ALF(4) [INP1] AT END
MOVE 0,LST ; * SCX+7
MOVE 1,SCX+=9 ; ;
;; MOVE 2,SCN+4 ; /
MOVE 2,LSL ; /
SETZ 3, ;AC3=0
MOVEI 5,=71
;;; MOVEI 3,=71
L2901: CAME 2,ALF(3)
JRST L2903
MOVE 4,3 ;AC4=AC3
;;; MOVEM 1,ALF(3)
JRST L2902 ;GO TO L2902
;;; JRA 16,(16)
L2903: CAME 1,ALF(3)
JRST L2902
MOVEM 0,ALF(3)
JRA 16,(16)
;;;L2902: SKIPLE 3
L2902: AOJ 3,
CAMG 3,5
JRST L2901
MOVEM 1,ALF(4) ;GET LOC. OF LAST /
;;; SOJA 3,L2901
JRA 16,(16)
STFNUM: 0 ;FUNCTION STFNUM(STAFF)
SETOM SCXNR# ;SCXNR=-1 FLAG
SETZ 6,
STFN1: MOVE 2,INP(6)
MOVE 4,INP+1(6)
CAME 2,LS ;IS INP1='S'?
JRST NONUM
CAME 4,LTT ; IF(INP(2).EQ.'T')STAFF=NEXT NUM
CAMN 4,LP ; IS IT A P?
;; CAME 4,[ASCIZ/T /] ; IF(INP(2).EQ.'T')STAFF=NEXT NUM
;; CAMN 4,[ASCIZ/P /] ; IS IT A P?
SKIPA
JRST NONUM ;NO
MOVE 3,LZ ;PUT Z'S INTO FIRST LOCS.
;; MOVE 3,[ASCIZ/Z /] ;PUT Z'S INTO FIRST LOCS.
MOVE ML,6 ;ML=3+PTR
ADDI ML,3
MOVSI XMINUS,201400
MOVE 2,INP+2(6) ;LOOK AT 3RD CHAR.
CAME 2,LMI ;IS IT MINUS?
JRST .+3
MOVNS XMINUS
AOJ ML, ;ML=ML+1
JSA 16,NALF ;GET THE STAFF NUM.
JUMP INP-1(ML)
FLTR
FMPR XMINUS
CAME 4,LP ;IF NOT 'P' GO TO STFN2
;; CAME 4,[ASCIZ/P /] ;IF NOT 'P' GO TO STFN2
JRST STFN2
SETOM SCX+=30 ;RB=-1
MOVEM RMOD+1 ;SET4 IS NOW FILLED
JRST STFN3-1
STFN2: SETZM SCX+=30 ;RB=0
MOVEM @(16) ;TYPE STn/ TO SET STAFF NUM FOR ENTIRE LINE.
MOVE ML,6
STFN3: MOVE 2,INP(ML) ;LOOK FOR THE SLASH AND THROW ALL AWAY
MOVEM 3,INP(ML) ;SKIP UNTIL SEMI (CHANGED FROM SLASH AT S899)
AOJ ML,
CAME 2,LSL
JRST STFN3
SETZM SCXNR ;RETURN A ZERO
MOVE 6,ML
JRST STFN1 ;GO BACK AND LOOK FOR MORE.
NONUM: MOVE SCXNR ;NO STAFF NUM, RETURN A -1
JRA 16,1(16)
END